/*
 * This file implements a data structure that is built and maintained by the
 * preprocessor.
 *
 * All types that can be handled for host variable declarations has to
 * be handled eventually.
 *
 * src/interfaces/ecpg/include/ecpgtype.h
 */

/*
 * Here are all the types that we are to handle. Note that it is the type
 * that is registered and that has nothing whatsoever to do with the storage
 * class.
 *
 * Simple types
 * integers: char, short, int, long (signed and unsigned)
 * floats: float, double
 *
 * Complex types:
 * VARCHAR, VARCHAR2 - Strings with length (maxlen is given in the declaration)
 * Arrays of simple types and of VARCHAR, VARCHAR2 (size given in declaration)
 * Records build of simple types, arrays and other structs.
 *
 * Complicating things:
 * typedefs and struct names!
 *
 * Conclusion:
 * This is a typically recursive definition. A structure of typed list elements
 * would probably work fine:
 */

#ifndef _ECPGTYPE_H
#define _ECPGTYPE_H

#ifdef __cplusplus
extern "C"
{
#endif

enum ECPGttype
{
    ECPGt_char = 1, ECPGt_unsigned_char, ECPGt_short, ECPGt_unsigned_short,
    ECPGt_int, ECPGt_unsigned_int, ECPGt_long, ECPGt_unsigned_long,
    ECPGt_long_long, ECPGt_unsigned_long_long,
    ECPGt_bool,
    ECPGt_float, ECPGt_double,
    ECPGt_varchar, ECPGt_varchar2,
    ECPGt_numeric,                /* this is a decimal that stores its digits in
                                 * a malloced array */
    ECPGt_decimal,                /* this is a decimal that stores its digits in
                                 * a fixed array */
    ECPGt_date,
    ECPGt_timestamp,
    ECPGt_interval,
    ECPGt_array,
    ECPGt_struct,
    ECPGt_union,
    ECPGt_descriptor,            /* sql descriptor, no C variable */
    ECPGt_char_variable,
    ECPGt_const,                /* a constant is needed sometimes */
    ECPGt_EOIT,                    /* End of insert types. */
    ECPGt_EORT,                    /* End of result types. */
    ECPGt_NO_INDICATOR,            /* no indicator */
    ECPGt_string,                /* trimmed (char *) type */
    ECPGt_sqlda                    /* C struct descriptor */
};

 /* descriptor items */
enum ECPGdtype
{
    ECPGd_count = 1,
    ECPGd_data,
    ECPGd_di_code,
    ECPGd_di_precision,
    ECPGd_indicator,
    ECPGd_key_member,
    ECPGd_length,
    ECPGd_name,
    ECPGd_nullable,
    ECPGd_octet,
    ECPGd_precision,
    ECPGd_ret_length,
    ECPGd_ret_octet,
    ECPGd_scale,
    ECPGd_type,
    ECPGd_EODT,                    /* End of descriptor types. */
    ECPGd_cardinality
};

#define IS_SIMPLE_TYPE(type) (((type) >= ECPGt_char && (type) <= ECPGt_interval) || ((type) == ECPGt_string))

/* we also have to handle different statement types */
enum ECPG_statement_type
{
    ECPGst_normal,
    ECPGst_execute,
    ECPGst_exec_immediate,
    ECPGst_prepnormal
};

#ifdef __cplusplus
}
#endif

#endif                            /* _ECPGTYPE_H */
